home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
bbsutil
/
bsrc_250.zip
/
XMSEND.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-09-15
|
22KB
|
818 lines
/*--------------------------------------------------------------------------*/
/* */
/* */
/* ------------ Bit-Bucket Software, Co. */
/* \ 10001101 / Writers and Distributors of */
/* \ 011110 / Freely Available<tm> Software. */
/* \ 1011 / */
/* ------ */
/* */
/* (C) Copyright 1987-91, Bit Bucket Software Co., a Delaware Corporation. */
/* */
/* */
/* This module was written by Bob Hartman */
/* */
/* */
/* BinkleyTerm Xmodem Sender State Machine */
/* */
/* */
/* For complete details of the licensing restrictions, please refer */
/* to the License agreement, which is published in its entirety in */
/* the MAKEFILE and BT.C, and also contained in the file LICENSE.250. */
/* */
/* USE OF THIS FILE IS SUBJECT TO THE RESTRICTIONS CONTAINED IN THE */
/* BINKLEYTERM LICENSING AGREEMENT. IF YOU DO NOT FIND THE TEXT OF */
/* THIS AGREEMENT IN ANY OF THE AFOREMENTIONED FILES, OR IF YOU DO */
/* NOT HAVE THESE FILES, YOU SHOULD IMMEDIATELY CONTACT BIT BUCKET */
/* SOFTWARE CO. AT ONE OF THE ADDRESSES LISTED BELOW. IN NO EVENT */
/* SHOULD YOU PROCEED TO USE THIS FILE WITHOUT HAVING ACCEPTED THE */
/* TERMS OF THE BINKLEYTERM LICENSING AGREEMENT, OR SUCH OTHER */
/* AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO. */
/* */
/* */
/* You can contact Bit Bucket Software Co. at any one of the following */
/* addresses: */
/* */
/* Bit Bucket Software Co. FidoNet 1:104/501, 1:343/491 */
/* P.O. Box 460398 AlterNet 7:491/0 */
/* Aurora, CO 80046 BBS-Net 86:2030/1 */
/* Internet f491.n343.z1.fidonet.org */
/* */
/* Please feel free to contact us at any time to share your comments about */
/* our software and/or licensing policies. */
/* */
/*--------------------------------------------------------------------------*/
/* Include this file before any other includes or defines! */
#include "includes.h"
void Build_Header_Block (XMARGSP args, char type)
{
struct FILEINFO dta;
SEADATAP ttmp;
(void) dfind (&dta, args->filename, 0);
args->save_header = type;
ttmp = (SEADATAP) &(args->header);
(void) memset (ttmp, 0, sizeof (XMDATA));
ttmp->header = type;
ttmp->block_num = 0;
ttmp->block_num_comp = 0xff;
ttmp->filelength = args->filelen;
(void) strncpy (ttmp->sendingprog, xfer_id, 14);
if (type == SYN)
{
(void) memset (ttmp->filename, ' ', 16);
ttmp->timedate = dta.time;
/* This is the CRC bit in the TeLink header */
ttmp->Resync = 1;
}
else
{
ttmp->timedate = args->save_filetime.oneword.timedate;
ttmp->SLO = (unsigned char) (((cur_baud.rate_value >= 9600) && !no_overdrive)? 1 : 0);
ttmp->Resync = (unsigned char) (no_resync ? 0 : 1);
ttmp->MACFLOW = 1;
}
if (args->temp_name != NULL)
(void) strncpy (ttmp->filename, args->temp_name, strlen (args->temp_name));
else
(void) strncpy (ttmp->filename, (char *) (dta.name), strlen (dta.name));
}
void XSSetVars (XMARGSP);
int XSInit (XMARGSP, int);
int XSEnd (XMARGSP, int);
int XSXmtStart (XMARGSP);
int XSXmTeStrt (XMARGSP);
int XSCheckACK (XMARGSP);
int XSSendBlk (XMARGSP);
int XSWaitEnd (XMARGSP);
STATES Xmodem_Sender[] = {
{ "XSInit", XSInit },
{ "XSEnd", XSEnd },
{ "XS0", XSXmtStart },
{ "XS0T", XSXmTeStrt },
{ "XS1", XSCheckACK },
{ "XS2", XSSendBlk },
{ "XS3", XSWaitEnd }
};
int XSInit (XMARGSP args, int start_state)
{
struct stat st;
char junkbuff[100];
/* Get the file information */
if (stat (args->filename, &st))
{
/* Print error message */
return (OPEN_ERR);
}
if ((args->file_pointer = share_fopen (args->filename, "rb", DENY_WRITE)) == NULL)
{
/* Print error message */
return (OPEN_ERR);
}
/* Get important information out of it */
args->filelen = st.st_size;
args->LastBlk = (st.st_size + 127) / 128;
args->save_filetime.oneword.timedate = st.st_atime;
args->prev_bytes = 0L;
args->tot_errs = 0;
(void) sprintf (junkbuff, MSG_TXT(M_SEND_MSG), args->LastBlk, args->filename, st.st_size);
if (un_attended && fullscreen)
{
clear_filetransfer ();
sb_move (file_hWnd, 1, 2);
FlLnModeSet( FILE_LN_2, 1 );
sb_puts( GetDlgItem( file_hWnd, FILE_LN_1 ), junkbuff );
elapse_time ();
sb_show ();
}
else
{
status_line ("+%s", junkbuff);
(void) printf ("\n");
}
locate_y = wherey ();
locate_x = wherex ();
/* Start the throughput calculations */
throughput (0, 0L);
return (start_state);
}
int XSEnd (XMARGSP args, int cur_state)
{
args->result = cur_state;
/* Close file */
(void) fclose (args->file_pointer);
if (args->tot_errs > 3)
status_line (MSG_TXT(M_CORRECTED_ERRORS), args->tot_errs, args->LastBlk);
/* Log that we sent it */
if (cur_state == SUCCESS)
{
throughput (1, (unsigned long) (args->filelen - args->prev_bytes));
status_line ("%s: %s", MSG_TXT(M_FILE_SENT), args->filename);
update_files (1);
}
return (cur_state);
}
void XSSetVars (XMARGSP args)
{
if (no_sealink)
{
args->options.SLO = 0;
args->options.Resync = 0;
}
else
{
args->options.SLO = ((cur_baud.rate_value >= 9600) && !no_overdrive) ? 1 : 0;
args->options.Resync = (~no_resync) & 1;
}
args->options.SEAlink = 0;
args->SendBLK = 1;
args->curr_byte = 0L;
args->NextBLK = 1;
args->ACKST = 0;
args->ACKBLK = -1L;
args->Window = 1;
args->ACKsRcvd = 0;
args->NumNAK = 0;
args->T1 = timerset (3000);
}
int XSXmtStart (XMARGSP args)
{
XSSetVars (args);
Build_Header_Block (args, SOH);
return (XS1);
}
int XSXmTeStrt (XMARGSP args)
{
XSSetVars (args);
Build_Header_Block (args, SYN);
return (XS1);
}
int XSCheckACK (XMARGSP args)
{
Check_ACKNAK (args);
return (XS2);
}
int XSSendBlk (XMARGSP args)
{
if (!CARRIER)
return (CARRIER_ERR);
if (got_ESC ())
{
status_line (MSG_TXT(M_KBD_MSG));
return (KBD_ERR);
}
if ((args->NumNAK > 4) &&